/* * Copyright 2012 jMethods, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.myjavaworld.jftp; import java.awt.Component; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.util.Iterator; import java.util.Map; import java.util.ResourceBundle; import java.util.TreeMap; import java.util.Vector; import javax.swing.DefaultCellEditor; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import com.myjavaworld.ftp.FTPConstants; import com.myjavaworld.gui.MComboBox; import com.myjavaworld.gui.MLabel; import com.myjavaworld.gui.MScrollPane; import com.myjavaworld.gui.MTable; import com.myjavaworld.gui.MTableCellRenderer; import com.myjavaworld.gui.MTextField; import com.myjavaworld.util.ResourceLoader; /** * A supporting panel used by the preferences dialog. * * @author Sai Pullabhotla, psai [at] jMethods [dot] com * @version 2.0 * */ public class TransferModesPrefsPanel extends JPanel { private static final ResourceBundle resources = ResourceLoader .getBundle("com.myjavaworld.jftp.TransferModesPrefsPanel"); private static final String[] COLUMN_NAMES = { resources.getString("text.fileType"), resources.getString("text.transferMode") }; private static final String[] TYPE_NAMES = { "ASCII", "Binary" }; private TypesTableModel model = null; private MTable table = null; private MComboBox comboDefaultTransferMode = null; public TransferModesPrefsPanel() { super(); setLayout(new GridBagLayout()); initComponents(); configureTable(); } @Override public Dimension getPreferredSize() { return new Dimension(400, 300); } public boolean validateFields() { return true; } public void populateScreen() { populateScreen(JFTP.prefs); } public void populateScreen(JFTPPreferences prefs) { comboDefaultTransferMode.setSelectedIndex(prefs .getDefaultTransferType() - 1); model.setData(prefs.getTransferTypes()); } public void saveChanges() { int rowCount = model.getRowCount(); Map map = new TreeMap(); for (int i = 0; i < rowCount; i++) { String extension = (String) model.getValueAt(i, 0); if (extension.trim().length() > 0) { map.put(extension, model.getValueAt(i, 1)); } } JFTP.prefs.setTransferTypes(map); JFTP.prefs.setDefaultTransferType(comboDefaultTransferMode .getSelectedIndex() + 1); } private void initComponents() { GridBagConstraints c = new GridBagConstraints(); c.anchor = GridBagConstraints.WEST; c.fill = GridBagConstraints.HORIZONTAL; // model = new TypesTableModel(JFTP.prefs.getTransferTypes()); model = new TypesTableModel(); table = new MTable(model); c.gridx = 0; c.gridy = 0; c.gridwidth = 2; c.gridheight = 2; c.weightx = 0.5; c.weighty = 0.5; c.fill = GridBagConstraints.BOTH; c.insets = new Insets(12, 12, 12, 12); MScrollPane scroller = new MScrollPane(table); add(scroller, c); MLabel labDefaultTransferMode = new MLabel( resources.getString("text.defaultTransferMode")); c.gridx = 0; c.gridy = 2; c.gridwidth = 1; c.gridheight = 1; c.weightx = 0.0; c.weighty = 0.0; c.fill = GridBagConstraints.NONE; c.insets = new Insets(0, 12, 12, 12); add(labDefaultTransferMode, c); comboDefaultTransferMode = new MComboBox(TYPE_NAMES); c.gridx = 1; c.gridy = 2; c.gridwidth = 1; c.gridheight = 1; c.weightx = 0.5; c.weighty = 0.0; c.fill = GridBagConstraints.HORIZONTAL; c.insets = new Insets(0, 0, 12, 12); add(comboDefaultTransferMode, c); populateScreen(); } private void configureTable() { table.setDefaultRenderer(Object.class, new MTableCellRenderer()); table.setDefaultRenderer(Integer.class, new TransferTypeCellRenderer()); MComboBox comboTypes = new MComboBox(TYPE_NAMES); table.setDefaultEditor(Integer.class, new DefaultCellEditor(comboTypes)); DefaultCellEditor fileTypeEditor = new DefaultCellEditor( new MTextField()); fileTypeEditor.setClickCountToStart(1); table.setDefaultEditor(Object.class, fileTypeEditor); } private class TypesTableModel extends AbstractTableModel { private Vector extensions = null; private Vector types = null; public TypesTableModel() { this(new TreeMap()); } public TypesTableModel(Map map) { setData(map); } public void setData(Map map) { if (map == null) { map = new TreeMap(); } extensions = new Vector(map.size()); types = new Vector(map.size()); for (Iterator i = map.keySet().iterator(); i.hasNext();) { String key = (String) (i.next()); extensions.add(key); types.add(map.get(key)); } addEmptyRow(); fireTableDataChanged(); } public int getRowCount() { return extensions.size(); } public int getColumnCount() { return COLUMN_NAMES.length; } @Override public String getColumnName(int col) { return COLUMN_NAMES[col]; } public Object getValueAt(int row, int col) { if (col == 0) { return extensions.get(row); } else { return types.get(row); } } @Override public void setValueAt(Object value, int row, int col) { String str = value.toString(); if (col == 0) { extensions.set(row, str.toUpperCase()); if (row == extensions.size() - 1 && str.trim().length() != 0) { addEmptyRow(); } } else { int type = str.equals(TYPE_NAMES[0]) ? FTPConstants.TYPE_ASCII : FTPConstants.TYPE_BINARY; types.set(row, new Integer(type)); } fireTableDataChanged(); } @Override public Class getColumnClass(int col) { if (col == 1) { return Integer.class; } return Object.class; } @Override public boolean isCellEditable(int row, int col) { return true; } private void addEmptyRow() { extensions.add(""); types.add(new Integer(FTPConstants.TYPE_ASCII)); } } private static class TransferTypeCellRenderer extends MTableCellRenderer { public TransferTypeCellRenderer() { super(); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { int type = ((Integer) value).intValue(); setText(TYPE_NAMES[type - 1]); setBackground(isSelected ? table.getSelectionBackground() : table .getBackground()); setForeground(isSelected ? table.getSelectionForeground() : table .getForeground()); setFont(table.getFont()); return this; } } }